package kiv.gener;

import java.util.*;

/**
 * Tato třída je klasický HeapSort upravený na ArrayList a řadí vzdálenosti
 * odběrných míst od jednotlivých ostatních odběrných míst. Na základě tohoto
 * seřazení se pak připojují ty nejbližší jako sousedé.
 * 
 * @author Ondřej Ptáček
 * 
 */

public class RazeniDomu {
    public static List<Krajina> HeapSortDomu = new ArrayList<Krajina>();
    public static int velikost = 0;

    /**
     * Metoda pridej() přidá další hodnotu k seřazení
     * 
     * @param data
     *            Odkud brát
     */

    public static void Pridej(Krajina data) {
        HeapSortDomu.add(velikost, data);
        velikost++;
        Nahoru(velikost - 1);
    }

    /**
     * Metoda nahoru() přeskládá haldu, tak aby odpovídala novému seřazení.
     * 
     * @param n
     *            Počátek
     */

    public static void Nahoru(int n) {
        if (n == 0) {
            return;
        }
        Krajina novy = HeapSortDomu.get(n);
        Krajina puvodni = HeapSortDomu.get(n - 1);
        int porovnani = Porovnej(novy, puvodni);
        if (porovnani <= 0) {
            return;
        }
        HeapSortDomu.set(n, puvodni);
        HeapSortDomu.set(n - 1, novy);
        Nahoru(n - 1);
    }

    public static Krajina Odstran() {
        if (velikost == 0) {
            throw new NoSuchElementException();
        }
        Krajina docasny = HeapSortDomu.get(0);
        HeapSortDomu.set(0, HeapSortDomu.get(velikost - 1));
        velikost--;
        Dolu(0);
        return docasny;
    }

    public static void Dolu(int n) {
        if (n >= velikost) {
            return;
        }
        if ((2 * n + 2) < velikost) {
            Krajina novy = HeapSortDomu.get(n);
            Krajina levy = HeapSortDomu.get(2 * n + 1);
            Krajina pravy = HeapSortDomu.get(2 * n + 2);
            int PorovnanisLevym = Porovnej(novy, levy);
            int PorovnanisPravym = Porovnej(novy, pravy);
            if (PorovnanisLevym > 0 || PorovnanisPravym > 0) {
                int porovnani = Porovnej(levy, pravy);
                if (porovnani < 0) {
                    HeapSortDomu.set(n, levy);
                    HeapSortDomu.set(2 * n + 1, novy);
                    Dolu(2 * n + 1);
                } else {
                    HeapSortDomu.set(n, pravy);
                    HeapSortDomu.set(2 * n + 2, novy);
                    Dolu(2 * n + 2);
                }
            }

        } else {
            Krajina novy = HeapSortDomu.get(n);
            Krajina levy = HeapSortDomu.get(2 * n + 1);
            int porovnani = Porovnej(novy, levy);
            if (porovnani > 0) {
                HeapSortDomu.set(n, levy);
                HeapSortDomu.set(2 * n + 1, novy);
            }

        }

    }

    /**
     * Metoda porovnej() porovná dvě hodnoty a podle výsledku vrátí přísluné
     * číslo pro nasledné seřazení.
     * 
     * @param a
     *            První
     * @param b
     *            Druhý
     * @return -1, 0, +1
     */

    public static int Porovnej(Krajina a, Krajina b) {
        if (Odberatele.typRazeni == 1) {
            if (a.vzdalenosti[SpojSousedy1.sloupec] == b.vzdalenosti[SpojSousedy1.sloupec]) {
                return 0;
            }
            if (a.vzdalenosti[SpojSousedy1.sloupec] < b.vzdalenosti[SpojSousedy1.sloupec]) {
                return +1;
            } else {
                return -1;
            }
        } else {
            if (a.vzdalenostiDomu[SpojSousedy1.sloupec] == b.vzdalenostiDomu[SpojSousedy1.sloupec]) {
                return 0;
            }
            if (a.vzdalenostiDomu[SpojSousedy1.sloupec] < b.vzdalenostiDomu[SpojSousedy1.sloupec]) {
                return +1;
            } else {
                return -1;
            }

        }

    }

}
